package Controller;

import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;

import javax.swing.JTextField;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.xml.sax.SAXException;

import Construibles.CentralEolica;
import Construibles.CentralMineral;
import Construibles.CentralNuclear;
import Construibles.Construible;
import Construibles.EstBomberos;
import Construibles.LineaDeTension;
import Construibles.PozoDeAgua;
import Construibles.Ruta;
import Construibles.Tuberia;
import Construibles.ZonaComercial;
import Construibles.ZonaIndustrial;
import Construibles.ZonaNula;
import Construibles.ZonaResidencial;
import Excepciones.DineroInsuficiente;
import Excepciones.JuegoNoEncontrado;
import Excepciones.SuperficieNoValida;
import Juego.Juego;
import Juego.Jugador;
import MapaStuff.Hectarea;
import Ubicacion.Punto;
import view.VentanaInicial;
import view.VentanaPrincipal;
import view.VentanaRedAgua;
import view.VistaHectarea;

public class ControladorPrincipal {
	
	Juego juegoPrincipal;
	Punto puntoSeleccionado;
	Jugador jugador;
	VentanaPrincipal vista;
	VentanaRedAgua vistaAgua;
	String ultimoNombre;
	
	public void conocerJuego (Juego juego){
		juegoPrincipal=juego;
	}
	
	public void conocerModelo(Jugador jugador){
		this.jugador = jugador;
	}
	
	//Metodos que crea controladores para la vista
	public MouseListener getControladorMouse(Hectarea hectareaModelo,
			VistaHectarea vista) {
		return new ControladorMouse(hectareaModelo, vista, this);
	}
	
	public MouseListener getControladorBotonResidencial() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.construir(new ZonaResidencial());
			}	
			});
	}

	public MouseListener getControladorBotonIndustrial() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.construir(new ZonaIndustrial());
			}	
			});
	}
	
	public MouseListener getControladorBotonRuta() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.construir(new Ruta());
			}	
			});
	}
	
	public MouseListener getControladorBotonTurno() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.pasarTurno();
			}	
			});
	}
	
	public MouseListener getControladorBotonComercial() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.construir(new ZonaComercial());
			}	
			});
	}
	
	public MouseListener getControladorBotonGodzilla() {
         return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.jugador.despertarGodzilla();
			}	
			});
 }
	
	public MouseListener getControladorBotonLinea() {
		 return new ControladorBoton(this, new ComandoControlador() {
				@Override
				public void ejecutar(ControladorPrincipal padre) {
					padre.construir(new LineaDeTension());
				}	
				});
	}

	public MouseListener getControladorBotonTuberia() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.construir(new Tuberia());
			}	
			});
	}
	
	public MouseListener getControladorBotonEolica() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.construir(new CentralEolica());
			}	
			});
	}
	
	public MouseListener getControladorBotonMineral() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.construir(new CentralMineral());
			}	
			});
	}
	
	public MouseListener getControladorBotonNuclear() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.construir(new CentralNuclear());
			}	
			});
	}
	
	public MouseListener getControladorBotonPozo() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.construir(new PozoDeAgua());
			}	
			});
	}
	
	public MouseListener getControladorBotonTerremoto() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.jugador.crearTerremoto();
			}	
			});
	}
	
	public MouseListener getControladorBotonBomberos() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.construir(new EstBomberos());
			}	
			});
	}
	
	public MouseListener getControladorRedAgua() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.clickSobreRedDeAgua();
			}	
			});
	}
	
	public MouseListener getControladorNuevoJuego() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.nuevoJuego();
			}	
			});
	}

	public MouseListener getControladorCargarJuego() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				padre.cargarJuego();
			}	
			});
	}
	
	public MouseListener getControladorGuardarJuego() {
		return new ControladorBoton(this, new ComandoControlador() {
			@Override
			public void ejecutar(ControladorPrincipal padre) {
				try {
					padre.guardarJuego();
				} catch (ParserConfigurationException | TransformerException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}	
			});
	}

	public ActionListener getControladorTecladoCargarJugador(JTextField panelTeclado) {
		return new ControladorTecladoCargar(this, panelTeclado);
	}
	
	public ActionListener getControladorTecladoNuevoJugador(JTextField panelTeclado) {
		return new ControladorTecladoNuevoJugador(this, panelTeclado);
	}
	
	public void hicieronClickEn(Hectarea hectareaModelo) {
		puntoSeleccionado = hectareaModelo.punto();
		vista.mostrarDatosDe(hectareaModelo);
	}

	public void construir(Construible unConstruible){
		try {
			jugador.ponerConstruibleEn(unConstruible, puntoSeleccionado);
			vista.mostrarExcepcion("Ninguno");
	} catch (DineroInsuficiente e) {
		try {
			jugador.ponerConstruibleEn(new ZonaNula(), puntoSeleccionado);
		} catch (DineroInsuficiente | SuperficieNoValida e1) {
			// No tiene costo y siempre es valido
		}
		vista.mostrarExcepcion("Dinero Insuficiente");
		
	} catch (SuperficieNoValida e) {
		vista.mostrarExcepcion("Superficie No Valida");
	}
	}
	
	public void pasarTurno() {
		jugador.pasarTurno();
		
	}
	
	public void conocerVista(VentanaPrincipal ventanaPrincipal) {
		vista = ventanaPrincipal;
	}
	
	public void conocerVistaAgua(VentanaRedAgua ventanaRedAgua){
		vistaAgua = ventanaRedAgua;
	}
	
	public void clickSobreRedDeAgua() {
	vistaAgua.setVisible(true);;
	}
	
	public void nuevoTerremoto() {
		jugador.crearTerremoto();
		
	}
	
	protected void guardarJuego() throws ParserConfigurationException, TransformerException {
		juegoPrincipal.guardarJuego(ultimoNombre);
		
	}

	protected void cargarJuego() {
		VentanaInicial.mostrarVentanaCarga();
		
	}
	
	protected void nuevoJuego() {
		VentanaInicial.mostrarVentanaNuevoJugador();
		
	}
	
	protected void cargarJugador(String nombre) throws  ParserConfigurationException, SAXException, IOException{
		try {
			juegoPrincipal.cargarJuego(nombre);
		} catch (JuegoNoEncontrado e) {
			VentanaInicial.mostrarErrorCargarJugador();
		}
	}

	public void iniciarNuevoJuegoConNombre(String textoCapturado) {
		 File archivo=new File("juegosGuardados",textoCapturado+".xml");
	    	if(!archivo.exists()){
	    		ultimoNombre=textoCapturado;
				juegoPrincipal.iniciarNuevoJuego();
	    	}
	    	else{
	    		VentanaInicial.mostrarErrorNuevoJugador();
	    	}
		
	}

	
	
}
